// @include "../code/Browser.js"
// @include "../code/Type.js"
// @include "../code/Class.js"
// @include "../code/Array.js"
// @include "../extend/Debug.js"

/**
 * @fileOverview Canvas的基本绘画元素
 * 
 * @version qinglan_element 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 基本绘画元素
 * 
 * @namespace
 * @type Object
 */
qinglan.Class.module('qinglan.Canvas.Event', function() {
			return {
				constructor : function(handle) {
					this.handle = handle;
					this._ListenList = [];
				}
			};
		}, function() {
			/**
			 * 事件记录ID
			 */
			var __fun_id = 1;
			/**
			 * 进行相关的类型的事件的绑定
			 * 
			 * @param {String}
			 *            type 事件类型
			 * @param {Function}
			 *            fun 响应事件
			 * @return {Boolean} 操作结果
			 */
			function addListener(eventHandle, type, fun) {
				!eventHandle._ListenList[type] && (this._ListenList[type] = []);
				!fun.__canvas_fun_Id && (fun.__canvas_fun_Id = __fun_id++);
				eventHandle._ListenList[type][fun.__canvas_fun_Id] = function() {
					fun.apply(eventHandle.handle, arguments);
				};
				return true;
			}
			/**
			 * 进行相关的类型的事件的移除
			 * 
			 * @param {String}
			 *            type 事件类型
			 * @param {Function}
			 *            fun 响应事件
			 * @return {Boolean} 操作结果
			 */
			function removeListerner(eventHandle, type, fun) {
				if (!fun.__canvas_fun_Id) {
					qinglan.Debug.error('The fun : [' + fun + '] is not in the ListenList!!');
					return false;
				};
				try {
					delete eventHandle._ListenList[type][fun.__canvas_fun_Id];
					return true;
				} catch (e) {
					eventHandle._ListenList[type][fun.__canvas_fun_Id] = qinglan.Function.emptyFun;
					qinglan.Debug.error('The fun : [' + fun + '] delete from ListenList failed!!');
					return false;
				}

			}
			return {
				/**
				 * 执行某种监听类型的方法
				 * 
				 * @param {qinglan.Canvas.Event}
				 *            eventHandle qinglan.Canvas.Event的实例
				 * @param {String}
				 *            type 需要执行事件的类型
				 */
				fireTypeEvent : function(eventHandle, type) {
					var eventList = eventHandle._ListenList[type];
					eventList && qinglan.Array.each(eventLIst, function(fun) {
								fun.call(this);
							}, eventHandle.handle);
				},
				/**
				 * 添加监听事件类型
				 * 
				 * @param {qinglan.Canvas.Event}
				 *            eventHandle qinglan.Canvas.Event的实例
				 * @param {String}
				 *            type 需要监听事件的类型
				 * @param {Function}fun
				 *            需要添加监听事件
				 */
				on : function(eventHandle, type, fun) {
					return addListener(eventHandle, type, fun);
				},
				/**
				 * 移除监听的事件
				 * 
				 * @param {qinglan.Canvas.Event}
				 *            eventHandle qinglan.Canvas.Event的实例
				 * @param {String}
				 *            type 需要删除事件的类型
				 * @param {Function}fun
				 *            需要删除监听事件
				 */
				remove : function(eventHandle, type, fun) {
					return removeListerner(eventHandle, type, fun);
				}
			};
		});